#!/usr/bin/env python
# coding: utf-8



#导入所需的库
import requests
import pandas as pd
import numpy as np
import time
import random
import matplotlib.pyplot as plt
from pyecharts.charts import WordCloud
from bs4 import BeautifulSoup





#设置请求头
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-User': '?1',
'Cache-Control': 'max-age=0',
'TE': 'trailers'}





#爬取的链接
url='https://sz.58.com/tech/pn{p}/?PGTID=0d303655-0000-471b-b006-2896d6ba5cb8&ClickID=3'





#创建列表
name=[]#岗位名称
location=[]#工作地址
job_wel=[]#福利待遇
comp_name=[]#公司名称
cate=[]#工作内容
job_salary=[]#薪水





#循环访问网页，爬取数据
for i in range(1,7):
    res=requests.get(url=url.format(p=i),headers=headers)
    time.sleep(60)
    bs=BeautifulSoup(res.text,"html.parser")
    datas=bs.find_all('li',class_="job_item clearfix")
    #如果某岗位缺少每个字段则添加空
    for data in datas:
        try:
            name.append(data.find('span',class_="name").text)
        except:
            name.append("")
        try:
            location.append(data.find('span',class_="address").text)
        except:
            location.append("")
        try:
            job_wel.append(data.find('div',class_="job_wel clearfix").text)
        except:
            job_wel.append("")
        try:
            comp_name.append(data.find('div',class_="comp_name").text)
        except:
            comp_name.append("")
        try:
            cate.append(data.find('span',class_="cate").text)
        except:
            cate.append("")
        try:
            job_salary.append(data.find('p',class_="job_salary").text)
        except:
            job_salary.append("")





#创建字典
dic={
    "公司名称":comp_name,
    "岗位":name,
    "工作内容":cate,
    "地址":location,
    "薪水":job_salary,
    "福利":job_wel}





df=pd.DataFrame(dic)#创建DDataFrame





df.head()#数据预览





df.to_excel("58同城.xlsx",index=None)#保存到Excel文件


# # 薪水分析
#薪水列只有面议和xxx-xxx元/月两种格式，为了方便分析，我们可以将元/月替换掉。同时筛选掉薪水面议的岗位，以此对深圳计算机、互联网相关岗位的薪水进行分析。



df["薪水"]=df["薪水"].str.replace('元/月',"")#将薪水列中的‘元/月’替换
sal=df[df["薪水"]!="面议"]#筛选出不包含薪水为面议的数据
sal_min=sal["薪水"].str.split('-',expand=True)[0].astype(np.float16)#薪水的下限
sal_max=sal["薪水"].str.split('-',expand=True)[1].astype(np.float16)#薪水的上线




#对薪水下限进行可视化
pd.cut(sal_min,bins=[4000,6000,8000,10000]).value_counts().plot.bar()
plt.show()

#通过对最低薪酬进行区间分析，大部分岗位给出的底薪都在4000到6000之间，很少有岗位能够给出8000到10000的底薪。可见在深圳这种一线城市，普通的程序员收入也没有与其他行业拉出太大的差距。



#对薪水上限进行可视化
pd.cut(sal_max,bins=[6000,8000,10000,12000]).value_counts().plot.bar()
plt.show()

#通过对最高薪酬进行区间分析，大部分岗位给出的顶薪都在8000到10000计算机行业的薪酬是十分客观的，计算机行业的成长性十分良好，都远远高于其他#行业。
# # 福利分析




happy=df["福利"].str.split(" ",expand=True)#对福利列的数据进行分列





#对分列的数据经行清洗并放入words列表中
words=[]
for i in range(1,8):
    for word in happy[i].tolist():
        if (word!=" ") and (word!="")and(word!=None):
            words.append(word)
#对words列表的词汇进行词频统计
word_count={}
for word in words:
    word_count[word]=word_count.get(word,0)+1
    sorted(word_count.items(),key=lambda x:x[1],reverse=True)


#用pyecharts绘制词云图
data = list(word_count.items())
mywordcloud = WordCloud()
mywordcloud.add('',data, shape='circle')
### 渲染图片
mywordcloud.render('58词云图.html')
print(df)
#通过对公司职位的福利待遇进行词频分析，源数据都是的福利待遇数据都是在一列当中，不方便统计分析，于是我们通过分列，运用循环迭代，将所有的词#放入一个列表，用于每一列都会有空格或者空白，我们再次循环迭代，留下有意义的词放入words这个列表，再通过循环，统计每个词出现的次数，再用#Pyecharts库绘制词云图可视化，进行分析。通过词云图，我们可以明显的看出公司的福利待遇主要有五险一金、周末双休、年底双薪。可见深圳的互联网企#业的福利待遇是十分不错的。




